﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CapaPresentacion.Commands;
using CapaPresentacion.Vistas;
using Entidades;
using CapaLogica;
using System.Windows.Input;
using System.Windows;
using System.Windows.Data;
using System.Transactions;
using System.Globalization;

namespace CapaPresentacion.Controles
{
    class NuevoProyectoDidacticoViewModel
    {


        public event ReiniciarCU ReiniciarCU;

        #region Variables

        private ProyectoDidactico proyectoDidactico;
        private ProyectoDidactico proyectoDidacticoSinModificaciones;
        private RelayCommand saveCommand;
        private RelayCommand newCommand;
        private RelayCommand openCommand;

        #endregion

        #region Propiedades

        public ICommand SaveCommand
        {
            get
            {
                return saveCommand;
            }
        }

        public ICommand OpenCommand
        {
            get
            {
                return openCommand;
            }
        }

        public ICommand NewCommand
        {
            get
            {
                return newCommand;
            }
        }

        public ProyectoDidactico ProyectoDidactico
        {
            get { return proyectoDidactico; }
            set { proyectoDidactico = value; }
        }

        #endregion

        public NuevoProyectoDidacticoViewModel()
        {

            this.proyectoDidactico = new ProyectoDidactico();
            this.proyectoDidactico.Eliminado = false;
            this.saveCommand = new RelayCommand(GuardarProyectoDidactico);
            this.newCommand = new RelayCommand(NuevoProyectoDidactico);
            this.openCommand = new RelayCommand(AbrirProyectoDidactico);
                        
        }


        public NuevoProyectoDidacticoViewModel(ProyectoDidactico entidad)
        {
            this.proyectoDidactico = entidad;
            this.proyectoDidacticoSinModificaciones = (ProyectoDidactico)entidad.Clone();
            this.saveCommand = new RelayCommand(GuardarProyectoDidactico);
            this.newCommand = new RelayCommand(NuevoProyectoDidactico);
            this.openCommand = new RelayCommand(AbrirProyectoDidactico);
        }

        private void NuevoProyectoDidactico(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea cargar los datos de un nuevo proyecto didáctico?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.NuevoProyectoDidactico);
            }
        }

        private void AbrirProyectoDidactico(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea editar los datos de un proyecto didáctico existente?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.BuscarProyectoDidactico);
            }
        }

        private void GuardarProyectoDidactico(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea guardar los datos?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {

                if (Validaciones())
                {                                     
                    try
                    {
                        this.proyectoDidactico.NombreProyectoDidactico = CultureInfo.InvariantCulture.TextInfo.ToTitleCase(this.proyectoDidactico.NombreProyectoDidactico);

                        if (proyectoDidactico.IdProyectoDidactico == Guid.Empty) // Nuevo Proyecto Didáctico
                        {
                            proyectoDidactico.IdProyectoDidactico = Guid.NewGuid();
                            new ProyectoDidacticoLogica().Agregar(proyectoDidactico);

                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "El proyecto didáctico ha sido guardado correctamente");
                            nueva.ShowDialog();

                            this.ReiniciarCU(CasosDeUso.NuevoProyectoDidactico);

                        }
                        else // Modificación de  Proyecto Didáctico
                        {
                            new ProyectoDidacticoLogica().Modificar(proyectoDidactico);

                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "El proyecto didáctico ha sido modificado correctamente");
                            nueva.ShowDialog();
                            this.ReiniciarCU(CasosDeUso.NuevoProyectoDidactico);

                        }

                    }
                    catch (Exception)
                    {

                        VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "  Ha ocurrido un error y el proyecto didáctico no se ha guardado");
                        nueva.ShowDialog();

                    }
                      
                }
                
            }
        }


        private bool Validaciones()
        {
            if (proyectoDidactico.NombreProyectoDidactico == null || proyectoDidactico.NombreProyectoDidactico == "")
            {
                if (proyectoDidacticoSinModificaciones != null)
                    this.proyectoDidactico.NombreProyectoDidactico = this.proyectoDidacticoSinModificaciones.NombreProyectoDidactico;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Nombre del proyecto' no puede estar vacío");
                nueva.ShowDialog();
                return false;
            }
            else
            {               
                bool nombreDuplicado = new ProyectoDidacticoLogica().VerificarNombreDuplicado(proyectoDidactico.NombreProyectoDidactico, proyectoDidactico.IdProyectoDidactico);

                if (nombreDuplicado)
                {
                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El Nombre del proyecto ya existe, debe elegir otro nombre");
                    nueva.ShowDialog();
                    return false;

                }               

            }

             if (proyectoDidactico.DescripcionProyectoDidactico == null || proyectoDidactico.DescripcionProyectoDidactico == "")
            {
                if (proyectoDidacticoSinModificaciones != null)
                    this.proyectoDidactico.DescripcionProyectoDidactico = this.proyectoDidacticoSinModificaciones.DescripcionProyectoDidactico;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Descripción del proyecto' no puede estar vacío");
                nueva.ShowDialog();
                return false;
            }           

            return true;
        }

    }
}
